// 在utils/auth.js中已经帮我封装好了获取token,设置token,移除token的方法
// 直接将方法引入到这个模块中
import {
  getToken,
  removeToken,
  setToken
} from '@/utils/auth'
import {
  login,
  getUserBaseInfo,
  getEmplyeeBaseInfo
} from '@/api/user.js'

export default {
  namespaced: true,
  // namespaced 是命名空间 能够保证内部模块的高封闭性
  // 不加namespaced即在默认情况下,可全局调用模块的mutations.actions.getters
  // 状态
  state: {
    // 定义token 持久化token=>放在缓存中
    token: getToken(),
    // 初始化vuex的时候 从缓存中读取状态,并赋值到初始化的状态上
    userInfo: {} // 定义公共数据 设置成空对象而不是null,是因为后面我们需要用到userInfo的属性,如果设置为null.会引起异常和报错
  },
  // 修改状态
  mutations: {
    // 设置token
    setToken(state, token) {
      state.token = token // 将数据设置给vuex 只是在修改state的数据
      // vuex变化=> 缓存数据
      setToken(token) // 同步给缓存
    },
    // 删除缓存
    removeToken(state) {
      state.token = null // 将vuex的数据置空
      removeToken() // 先清除vuex 再清除缓存vuex
    },
    // 设置用户信息
    setUserInfo(state, userInfo) {
      state.userInfo = userInfo // 设置数据
    },
    // 删除用户信息
    removeUserInfo(state) {
      state.userInfo = {} // 清除数据
    }
  },
  actions: {
    // 封装登录的action
    // 调用登录接口 成功后设置token到vuex 失败则返回失败
    // 发送请求 是异步任务 所以在actions里面
    // 封装一个登录的方法login 第二个参数是传的数据
    async login(context, data) {
      const res = await login(data) // 这里的login是调用接口的login 拿到token
      // // axios默认给数据加了一层data
      // // 获取token 保存到state中
      // if (res.data.success) {
      //   // 如果为true 表示登录成功
      context.commit('setToken', res) // 设置token 不处理是因为在拦截器中已经这是过了
    },

    // 封装登出的action
    logout(context) {
      // 删除token
      context.commit('removeToken') // 不仅删除vuex中的 还删除缓存中的
      // 删除用户资料
      context.commit('removeUserInfo') // 退出时清空数据
    },
    // 异步请求在action中定义
    // 获取用户资料action
    // -----逻辑梳理------:
    // 这里发请求获取到用户信息, 更新之后, 调用mutations中的setUserInfo方法, 将更新后的数据注入进入, 再通过mutations来修改state中userInfo的数据,再映射到getters中,更新name的值
    async getUserInfo(context) {
      const result = await getUserBaseInfo() // result就是用户的基本资料了
      const baseInfo = await getEmplyeeBaseInfo(result.userId) // 为了获取头像
      const baseResult = { ...result, ...baseInfo }
      // 模拟找不到图片
      // o.staffPhoto = 'http://q6cu3t6jv.bkt.clouddn.com/1063705989926227968?t=1582797590950'
      baseResult.staffPhoto = null
      //  模拟数据,设置null时候不会茶法onerror事件,但是会触发钩子函数update,如果一开始数据就为null.不会触发钩子函数update
      context.commit('setUserInfo', baseResult) // 将整个的个人信息设置到用户的vuex数据中
      return baseResult
    }
  }
}
